﻿#pragma once
namespace LK
{
	/**@brief 代理类的弱引用指针*/
	template<class T>struct WeakPtr:T
	{
		//默认构造空引用
		WeakPtr();
		//构造，并不会导致对象引用计数变化
		WeakPtr(typename T::IObj const* ptr);
		//构造，并不会导致对象引用计数变化
		WeakPtr(const T& w);
		//复制构造函数，并不会导致对象引用计数变化
		WeakPtr(const WeakPtr&w);
		//从其他类型弱引用构造
		template<class AnyT>WeakPtr(WeakPtr<AnyT>const& w, typename UseIf<IsBaseOf<T, AnyT>::V>::T*p = NULL);
		//赋值，并不会导致对象引用计数变化
		WeakPtr& operator=(const WeakPtr&w) ;
		//设置为空，并不会导致对象引用计数变化
		void SetToNull();
		//设置另一个引用，并不会导致对象引用计数变化
		void SetTo(typename T::IObj const*p);
		//析构，并不会导致对象引用计数变化
		~WeakPtr();
	};
}
